<?php
/**
 * 后台继承.
 * User: 1874
 * Date: 2019/5/5
 * Time: 16:32
 */

namespace app\adminplatform\controller;
use app\BaseController;
use app\adminplatform\model\AuthGroup;
use app\adminplatform\model\BackMenu;
use think\facade\Cache;
use think\facade\Config;
use think\facade\Session;
use think\facade\View;
use think\facade\Request;

define('PageNum', Config::get('app.page_num'));         //分页数量
define("REQUEST_LIST", "list");                         //列表
define("REQUEST_ADD", "add");                           //新增
define("REQUEST_EDIT", "edit");                         //修改
define("REQUEST_DEL", "del");                           //删除
define("REQUEST_DEL_ALL", "delAll");                    //批量删除
define("REQUEST_EXPORT", "export");                     //导出

abstract class Initial extends BaseController {
    /**
     * 构造函数
     */
    public function initialize(){
        //没有接收到session则跳转到登录
        if(!Session::has('userData.sessionId')){
            //重定向
            exit(header("Location:".url('Login/login')));
        }else{
            //获取管理员信息
            $userData = Session::get('userData');
            //登录状态检测用户是否在其他地方登录
            if(!checkOnlyLogin($userData)) self::onlyLoginDemo();
            //获取当前控制器和方法
            $auth = Request::controller().'/'.Request::action();
            //当前URL，管理员是否有权限访问
            if(!AuthGroup::checkMethod($userData, $auth)) self::checkMethodDemo();
            if(Request::isGet()){
                View::assign('nav', self::getMenuNavTitle($auth)); //获取菜单页面nav对应名称
                View::assign('userData', $userData);    //后台管理员信息
                View::assign('webInfo', website());     //网站配置
            }
        }
    }
    /**
     * 唯一登录demo
     */
    protected static function onlyLoginDemo(): void {
        //清除session
        Session::delete('userData');
        //请求类型
        if(Request::isPost()){
            $data = ['info'=>'您的账号已在其他设备登录','status'=>0];
            exit(setJsonArray($data));
        }else{
            echo "<div style='text-align: center;font-size: 30px;color: #009688;margin-top: 15%;'>您的账号已在其他设备登录</div>
                  <div style='text-align: center;font-size: 20px;margin-top: 10px;'>
                      <a style='text-decoration: none;cursor: pointer;color: #d92424;' href='".url('Login/login')."' target='_blank'>-- 重新登录 --</a>
                  </div>";
            exit();
        }
    }
    /**
     * 权限访问demo
     */
    protected static function checkMethodDemo(): void {
        if(Request::isPost()){
            $data = ['info'=>'您没有权限访问执行','status'=>0];
            exit(setJsonArray($data));
        }else{
            echo "<div style='text-align: center;font-size: 30px;color: #009688;margin-top: 15%;'>您没有权限访问执行</div>";
            exit();
        }
    }
    /**
     * 获取菜单页面nav对应名称
     * @param array $auth 路由地址
     */
    protected static function getMenuNavTitle(string $auth): array {
        //获取系统菜单缓存
        $key = Config::get("app.admin_menu");
        //如果没有缓存则重新获取
        if(!Cache::get($key)){
            $menu = BackMenu::getBackMenuList()->toArray();
            Cache::set($key, $menu);
        }else{
            $menu = Cache::get($key);
        }
        //查找路由所在的菜单位置信息
        $currentNav = self::getMenuNavInfo($menu, $auth);
        //有该菜单信息时执行
        if(!empty($currentNav)){
            $menu = self::getMenuNavParent($menu, $currentNav); //并递归查找路由上级菜单
            array_unshift($menu, $currentNav);     //第一行插入
            $menu = array_reverse($menu);   //返回翻转顺序的数组
        }else{
			$menu = [];
		}
        return $menu;
    }
    /**
     * 查询当前菜单对应的路由信息
     * @param array $list 菜单数组
     * @param string $currentAuth 当前路由
     */
    protected static function getMenuNavInfo(array $list, string $currentAuth): array {
        foreach ($list as $value) {
            if(!empty($value["bm_url"]) && $value["bm_url"] == $currentAuth){
                return $value;
            }
        }
        return [];
    }
    /**
     * 查找路由所在，并递归查找路由上级
     * @param array $menu 菜单数组
     * @param array $nav 当前菜单数组
     */
    protected static function getMenuNavParent(array $menu, array $nav): array {
        $array = [];
        foreach ($menu as $value) {
            if ($value["bm_id"] == $nav["bm_pid"]) {
                $array[] = $value;
                $childArr = self::getMenuNavParent($menu, $value);
                //合并数组
                if (is_array($childArr)) $array = array_merge($array, $childArr);
                break;
            }
        }
        return $array;
    }
}